﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Mail;
using System.Net;

namespace Bamboo.Utils
{
    /// <summary>
    /// 简单的发送邮件封装类
    /// </summary>
    public class MailSender: IDisposable
    {
        /// <summary>
        /// SMTP服务器地址
        /// </summary>
        public string ServerAddress { get; set; }
        /// <summary>
        /// SMTP服务器端口，默认为25
        /// </summary>
        public int ServerPort { get; set; } = 25;
        /// <summary>
        /// 用户名
        /// </summary>
        public string UserName { get; set; }
        /// <summary>
        /// 密码
        /// </summary>
        public string Password { get; set; }
        /// <summary>
        /// 标题
        /// </summary>
        public MailMessage Message { get; private set; } = new MailMessage();

        public void Send()
        {
            using (SmtpClient smtp = new SmtpClient(ServerAddress, ServerPort))
            {
                smtp.Credentials = new NetworkCredential(UserName, Password);
                smtp.Send(Message);
            }
        }
        /// <summary>
        /// 从文本文件加载收件人地址
        /// </summary>
        /// <param name="filename"></param>
        /// <param name="encodingName"></param>
        public void AddReceiverFromTextFile(string filename, string encodingName)
        {
            var list = GetMailAddressFromTextFile(filename, encodingName);
            foreach (var item in list)
            {
                Message.To.Add(item);
            }
        }

        /// <summary>
        /// 从文本文件加载抄送地址
        /// </summary>
        /// <param name="filename"></param>
        /// <param name="encodingName"></param>
        public void AddCcFromTextFile(string filename, string encodingName)
        {
            var list = GetMailAddressFromTextFile(filename, encodingName);
            foreach (var item in list)
            {
                Message.CC.Add(item);
            }
        }

        public static List<MailAddress> GetMailAddressFromTextFile(string filename, string encodingName)
        {
            var e = Encoding.GetEncoding(encodingName);
            var list = new List<MailAddress>();
            var lines = System.IO.File.ReadAllLines(filename, e);
            foreach (var line in lines)
            {
                if (line.Contains("|"))
                {
                    var parts = line.Split('|');
                    var item = new MailAddress(parts[1].Trim(), parts[0].Trim());
                    list.Add(item);
                }
                else
                {
                    var item = new MailAddress(line.Trim());
                    list.Add(item);
                }
            }
            return list;
        }

        #region IDisposable Support
        private bool disposedValue = false; // 要检测冗余调用

        protected virtual void Dispose(bool disposing)
        {
            if (!disposedValue)
            {
                if (disposing)
                {
                    Message.Dispose();
                    Message = null;
                }

                // TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。
                // TODO: 将大型字段设置为 null。

                disposedValue = true;
            }
        }

        // TODO: 仅当以上 Dispose(bool disposing) 拥有用于释放未托管资源的代码时才替代终结器。
        // ~MailSender()
        // {
        //   // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
        //   Dispose(false);
        // }

        // 添加此代码以正确实现可处置模式。
        public void Dispose()
        {
            // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
            Dispose(true);
            // TODO: 如果在以上内容中替代了终结器，则取消注释以下行。
            // GC.SuppressFinalize(this);
        }
        #endregion
    }
}
